package com.wuliang.blog.response;

import lombok.extern.slf4j.Slf4j;

/**
 * @author baiyl
 * @className ResultUtil
 * @description 通用接口返回类型的工具类，便于赋值，并将返回结果输出到控制台上
 */
@Slf4j
public class ResultUtil {

    /**
     * 请求成功后将结果以json的格式返回
     *
     * @param object 返回内容
     * @return Result<Object>
     */
    @SuppressWarnings("finally")
    public static Result<Object> success(Object object) {
        Result<Object> result = new Result<>();
        result.setMessage("操作成功");
        result.setReturnCode(200);
        result.setValue(object);
        return result;
    }

    /**
     * 自定义返回消息
     *
     * @param message 自定义消息提示
     * @param value   返回内容
     * @return {@see Result<Object>}
     */
    public static Result<Object> success(String message, Object value) {
        return new Result<Object>(message, value, ReturnCode.SUCCESS.getCode());
    }

    /**
     * 请求成功，但没有返回数据
     *
     * @return Result<Object>
     */
    public static Result<Object> success() {
        Result<Object> result = new Result<>();
        result.setValue(null);
        result.setMessage("操作成功");
        result.setReturnCode(200);
        return result;
    }

    /**
     * 请求失败，将状态码和错误信息返回
     *
     * @param returnCode {@link ReturnCode}
     * @return {@see Result<Object>}
     */
    public static Result<Object> error(ReturnCode returnCode) {
        return error(null, returnCode.getMessage(), returnCode);
    }

    /**
     * 请求失败，将状态码和错误信息返回
     * @param message
     * @param code
     * @return
     */
    public static Result<Object> error(String message, Integer code) {
        Result<Object> result = new Result<>();
        result.setValue(null);
        result.setReturnCode(code);
        result.setMessage(message);
        log.info("返回结果：" + message);
        return result;
    }

    /**
     * 自定义信息提示
     *
     * @param message    自定义提示信息
     * @param returnCode {@link ReturnCode}
     * @return {@see Result<Object>}
     */
    public static Result<Object> error(String message, ReturnCode returnCode) {
        return error(null, message, returnCode);
    }

    public static Result<Object> error(Object value, String message, ReturnCode returnCode) {
        return new Result<>(message, value, returnCode.getCode());
    }

    /**
     * 返回系统异常
     *
     * @param message 系统异常信息
     * @return {@see Result<Object>}
     */
    public static Result<Object> systemError(String message) {
        return new Result<>(message, ReturnCode.SYSTEM_EXCEPTION);
    }

    public static Result<Object> dataEmptyError(Object value, String message) {
        return new Result<>(message, value, ReturnCode.DATA_IS_EMPTY.getCode());
    }

    public static Result<Object> dataEmptyError(String message) {
        return dataEmptyError(null, message);
    }

    public static Result<Object> dataEmptyError() {
        return dataEmptyError(null, null);
    }

    public static Result<Object> accessError() {
        return error(ReturnCode.ACCESS_DENIED);
    }

}
